package com.errol.generic.file.core.service;

import com.renjia.service.generic.file.core.pojo.FileExtension;
import com.renjia.service.generic.file.core.pojo.Filepath;
import org.springframework.lang.NonNull;

import java.io.File;
import java.util.List;

/**
 * Created by Errol1017 on 2018/6/18.
 *
 * @author zhang xiao bin
 * @version v1.0
 * @date 2020/10/21
 * @since v4.7.6
 */
public interface FileInnerService {

    /**
     * 获取 fileBasePath
     *
     * @return 基础文件路径
     */
    String getFileBasePath();

    /**
     * 获取 Filepath 及其 二级目录（如有），以 File.separator 结尾
     *
     * @param filepath Filepath
     * @return 包含 Filepath.getPath() 及其二级目录（如有）的路径
     */
    String getSecondaryFilePath(@NonNull Filepath filepath);

    /**
     * 获取随机文件名，含扩展，不含路径
     *
     * @param filename 含文件扩展名的字符串
     * @return 随机文件名，保留原文件扩展
     */
    String newRandomFilename(@NonNull String filename);

    /**
     * 获取随机文件名，含扩展，不含路径
     *
     * @param fileExtension 文件扩展
     * @return 随机文件名，保留原文件扩展
     */
    String newRandomFilename(@NonNull FileExtension fileExtension);

    /**
     * 获取随机文件路径，不含基础目录路径
     *
     * @param filepath      文件夹
     * @param fileExtension 文件扩展
     * @return 服务端使用的文件完整路径
     */
    String newRandomFilePath(@NonNull Filepath filepath, @NonNull FileExtension fileExtension);

    /**
     * 创建新文件，随机文件名
     *
     * @param filepath      文件夹
     * @param fileExtension 文件扩展
     * @return 新文件
     */
    File newRandomFile(@NonNull Filepath filepath, @NonNull FileExtension fileExtension);

    /**
     * 返回 filepath 之前转换路径分隔符
     *
     * @param filePath 文件相对路径，接受 list
     * @return 前端使用的 filepath
     */
    String filePathOut(@NonNull List<String> filePath);

    /**
     * 返回 filepath 之前转换路径分隔符
     *
     * @param filePath 文件相对路径
     * @return 前端使用的 filepath
     */
    String filePathOut(@NonNull String filePath);

    /**
     * 读取 filepath 的文件之前转换路径分隔符
     *
     * @param filepath 文件相对路径
     * @return 服务端使用的 filepath ，并返回 list
     */
    List<String> filePathIn(@NonNull String filepath);

    /**
     * 创建 filepath 的二级目录
     *
     * @param filepath 需要处理的 filepath ，将检查是否需要按频率创建二级目录
     * @param needPlus 根据今天还是明天来创建目录
     */
    void createSecondaryFolderOfFilepath(@NonNull Filepath filepath, boolean needPlus);
}
